<!DOCTYPE html>
<html lang="zh-Hans">

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no">

    <link rel="stylesheet" href="./css/index.css" />
</head>

<body>
    <h1>npm</h1>
    <h2>参考链接</h2>
    <ul>
        <li><a target="_blank" href="https://www.kancloud.cn/god-is-coder/npm/588562">npm中文版</a></li>
        <li><a target="_blank" href="https://juejin.im/post/5d921a275188257edf66a9d7">NPM 中文文档</a></li>
        <li><a target="_blank" href="https://www.npmjs.cn/getting-started/what-is-npm/">npm 是什么？</a></li>
        <li><a target="_blank" href="http://javascript.ruanyifeng.com/nodejs/npm.html#toc21">npm模块管理器</a></li>
        <li><a target="_blank" href="https://juejin.im/post/5cda6f8be51d453aa44ad701#heading-11">nodejs进阶（1）——npm使用技巧和最佳实践</a></li>
        <li><a target="_blank" href="https://juejin.im/post/5d2708e26fb9a07f06559812">手把手教你如何用npm发布包</a></li>
    </ul>

    <h2>npm是什么?</h2>

    <p>了解npm，需要了解3个方面：</p>

    <ul>
        <li><a target="_blank" href="https://www.npmjs.com/">npm的官方网站</a>，是开发者查找包（package）、设置参数以及管理npm使用体验的主要途径。</li>
        <li>注册表，是一个巨大的数据库，保存了每个包（package）的信息。</li>
        <li><a target="_blank" href="https://docs.npmjs.com/cli/npm">npm CLI 命令行工具</a> ，通过命令行或终端运行。开发者通过 CLI 与 npm 打交道。</li>
    </ul>

    <h2>npm能做到什么程度?</h2>
    <ul>
        <li>npm上, 包含超过600000个包（package），（即，代码模块），可方面快捷的调用，提高代码复用。</li>
        <li>方便多项目版本控制管理。</li>
        <li>通过上传自己编写的功能包，以达到代码复用的功效。</li>
    </ul>

    <h2>npm的学习</h2>

    <h3>npm的安装</h3>
    <p>安装npm，建议通过安装nodejs的方式, 从<a target="_blank" href="https://nodejs.org/en/download/">nodejs官网</a>进行下载安装</p>
    <p>通过这种方式安装完成后，即可在命令行中使用npm了。</p>

    <pre>
// 命令查看npm当前的版本
$ npm -v
6.13.6

// 命令-安装最新版本的npm
$ npm install npm@latest -g
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
/usr/local/bin/npx -> /usr/local/lib/node_modules/npm/bin/npx-cli.js
+ npm@6.13.6
updated 1 package in 5.392s
    </pre>


    <h4>如果使用过程中，遇到权限问题?</h4>
    
    <p>解决方法一(推荐使用), 建议使用<a target="_blank" href="https://www.npmjs.com/package/npx">npx</a></p>
    <p>解决方法二, 修改npm默认目录</p>
    <pre>
// 创建用于全局安装的目录
$ mkdir ~/.npm-global
// 配置npm以使用新的目录路径
$ npm config set prefix '~/.npm-global'
// 打开或创建~/.profile文件并添加以下行
export PATH=~/.npm-global/bin:$PATH
// 返回命令行，更新系统变量
$  source ~/.profile
    </pre>

    <h3>npm的用法</h3>

    <h4>本地安装和全局安装</h4>
    <p>如果你自己的模块依赖于某个包，并通过 Node.js 的 require 加载，那么你应该选择本地安装，这种方式也是 npm install 命令的默认行为。</p>
    <p>如果你想将包作为一个命令行工具，（比如 grunt CLI），那么你应该选择全局安装。</p>
    
    <h4>使用package.json</h4>
    <p>如果不存在package.json, 则可以通过以下命令创建:</p>
    <pre>npm init</pre>
    <p>如果已存在package.json, 则可以通过以下命令运行并下载依赖项:</p>
    <pre>npm install</pre>

    <h4>新增本地包</h4>
    <p>如果仅打算本地尝试，则可以执行以下命令:</p>
    <pre>npm install &lt;package_name&gt;</pre>
    <p>上述命令执行之后将会在当前的目录下创建一个 node_modules 的目录（如果不存在的话），然后将下载的包保存到这个目录下。</p>

    <p>如果您的应用程序在生产中需要这些软件包，则可以安装本地包到package.json的中dependencies:</p>
    <pre>npm install &lt;package_name&gt; --save</pre>
    <p>如果这些软件包仅在开发和测试时需要，则可以安装本地包到package.json的中devDependencies:</p>
    <pre>npm install &lt;package_name&gt; --save-dev</pre>


    <h4>包的版本问题</h4>
    <p>npm安装默认规则为：^version, 如：^1.1.2 ，则表示下一次install的时候，有可能版本为&gt;=1.1.2，&lt;2.0.0，</p>
    <p>如果想要版本的默认规则为：~version，如：~1.1.2，表示&gt;=1.1.2 &lt;1.2.0，可以是1.1.2，1.1.3，.....，1.1.n，则可以执行以下命令：</p>
    <pre>npm config set save-prefix='~'</pre>
    <p>如果你想保存指定的版本号，则可以执行以下命令: </p>
    <pre>npm config set save-exact true</pre>
    <p>如果想要锁定版本依赖，则可以执行以下命令:</p>
    <pre>npm shrinkwrap</pre>
    <p>上述命令会生成一个npm-shrinkwrap.json，这个文件里面不仅包含了安装在你机器上的指定版本的包，而且还有包的指定版的依赖包，一旦在项目的根目录下有这个文件，你执行npm install命令会重新生成一个相同的依赖树</p>

    <h4>更新本地包</h4>
    <p>在 package.json 文件所在的目录中执行以下命令:</p>
    <pre>npm update</pre>
    <p>如果需要检测本地包是否最新，则可以执行以下命令:</p>
    <pre>npm outdated</pre>

    <h4>删除本地包</h4>
    <p>如需删除 node_modules 目录下面的包（package），请执行:</p>
    <pre>npm uninstall &lt;package&gt;</pre>

    <h4>全局包操作命令</h4>

    <pre>
// 安装全局包
npm install -g &lt;package&gt;
// 更新单个全局包
npm update -g &lt;package&gt;
// 找出需要更新的软件包
npm outdated -g --depth=0 .
// 更新全部全局包
npm update -g .
// 删除全局包
npm uninstall -g &lt;package&gt;
    </pre>

    <h4>代理设置</h4>

    <pre>
// 设置代理
npm config set proxy http://your proxy
// 删除代理
npm config delete proxy
    </pre>

    <h3>发布一个npm包</h3>
    <ul>
        <li>创建一个模块、或者在已有模块添加关联的package.json文件</li>
        <li>
            确认package.json文件中name、main、keywords、author、license字段的正确性
            <ul>
                <li><strong>name</strong> 你的模块名， 需要保证唯一，npm仓库上的模块名是不能重复的</li>
                <li><strong>main</strong> 描述了当你用require('modulename')引用这个模块的时候，引用的是哪个文件，这个字段的值你可以采用默认的或者修改成你项目中任何一个有效的文件</li>
                <li><strong>keywords</strong> 关键字索引</li>
                <li><strong>author</strong> 作者署名</li>
                <li><strong>license</strong> 开源许可说明</li>
            </ul>
        </li>
        <li>
            确认version字段的正确性，npm的语义化版本定义:major.minor.patch(大版本.小版本.补丁版)
            <ul>
                <li><strong>大版本</strong>做了不兼容的API修改</li>
                <li><strong>小版本</strong>添加了向后兼容的功能</li>
                <li><strong>补丁版</strong>做了向后兼容的bug修复</li>
            </ul>

        <li>考虑增加<strong>README.md</strong>说明文档。考虑使用<strong>.npmignore</strong>文件来记录、隔离不发布的私有文件</li>
        <li>在<a target="_blank" href="https://www.npmjs.com/">npm官网</a>注册npm账户</li>
        <li>使用<strong>npm login</strong>命令，在终端进行登录</li>
        <li>使用<strong>npm publish</strong>命令，进行发布</li>
    </ul>

    <p>其他参考命令如下:</p>
    <pre>
// 更新npm包的版本
    // 第一步更新线上版本
    npm version major/minor/patch
    // 第二步进行发布
    npm publish

// 删除npm指定版本包
npm unpublish 包名@版本号
// 删除npm整个包
// npm unpublish 包名 --force
    </pre>

    <h3>npx的使用介绍</h3>
    <h4>参考链接</h4>
    <ul>
        <li><a target="_blank" href="https://www.ruanyifeng.com/blog/2019/02/npx.html">npx 使用教程</a></li>
    </ul>

    <p>npx不需要安装，随着npm的安装而安装。</p>
    <p>npx的主要作用为：避免全局安装模块. 示例如下：</p>
    
    <pre>npx create-react-app my-react-app</pre>

    <p>上面代码运行时，npx 将create-react-app下载到一个临时目录，使用以后再删除。所以，以后再次执行上面的命令，会重新下载create-react-app。</p>

    <h3>nrm的使用介绍</h3>
    <h4>参考链接</h4>
    <ul>
        <li><a target="_blank" href="https://www.npmjs.com/package/nrm">nrm-NPM注册管理器</a></li>
    </ul>

    
    <p>nrm可以帮助你不同的NPM登记之间方便，快捷开关，现在包括：npm，cnpm，taobao，nj(nodejitsu)。</p>

    <pre>
// nrm的安装
npm install -g nrm
// nrm查看所有源地址
nrm ls
// 切换指定源地址
nrm use cnpm 
    </pre>
</body>

</html>